/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clases;

import beans.dao.CitaDAO;
import core.constructor.constructor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import tools.Util;
import v.Borrarme;

/**
 *
 * @author !gaso
 */
public class ButtonEditor extends DefaultCellEditor {

    protected JButton button;
    private String label;
    private boolean isPushed;
    private JTable dev_tabla;
    //Codigo del Elemento a Consultar/Modificar/Eliminar
    private String id, Action;
    constructor c;
    
    private static final String ASIGNADO = "1";

    public ButtonEditor(JCheckBox checkBox, String ed_img, JTable tablaImplementacion, Object... c) {
        super(checkBox);

        //configurar el Constructor
        setConstructor(c);

        button = new JButton();
        dev_tabla = tablaImplementacion;
        //Agregar Imagen al Boton al dar Clic
        button.setIcon(new javax.swing.ImageIcon(getClass().getResource(ed_img)));
        button.setOpaque(true);
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                fireEditingStopped();


            }
        });
    }

    private void setConstructor(Object... e) {
        if (e.length > 0) {
            c = (constructor) e[0];
        }
    }

    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
        if (isSelected) {
            button.setForeground(table.getSelectionForeground());
            button.setBackground(table.getSelectionBackground());
        } else {
            button.setForeground(table.getForeground());
            button.setBackground(table.getBackground());
        }
        label = (value == null) ? "" : value.toString();
        button.setText(label);
        isPushed = true;


        return button;
    }

    public Object getCellEditorValue() {

        if (isPushed) {

            //  JOptionPane.showMessageDialog(button, label + String.valueOf(ed_dev_tabla.getValueAt(ed_dev_tabla.getEditingRow(), 0)));


            id = String.valueOf(dev_tabla.getValueAt(dev_tabla.getEditingRow(), 0));

            //Tomar como Accion el Nombre de la Columna y No el Label
            Action = dev_tabla.getColumnName(dev_tabla.getSelectedColumn());
            System.out.println(Action + "| " + id);

            System.out.println("getName Tabla : " + dev_tabla.getName());
            if ("Consultar".equals(Action)) {
                System.out.println("Aqui Consultar");
                System.out.println("mod(VIEW) = " + dev_tabla.getName() + "_View_Add para " + id);
                if (c != null) {
                    c.constructor(dev_tabla.getName() + "_View_Add", "SELECT", id);
                }


            } else if ("Modificar".equals(Action) || "Asignar".equals(Action)) {
                System.out.println("Aqui Modificar");
                System.out.println("mod(UPDATE) = " + dev_tabla.getName() + "_View_Add para " + id);
                if (c != null) {
                    c.constructor(dev_tabla.getName() + "_View_Add", "UPDATE", id);
                }

            } else if (Action.equals("Eliminar")) {
                String sql = "";
                String tituloMensajeOK = "";
                String tituloMensajeBAD = "";
                
                int opcion = JOptionPane.showConfirmDialog(null, "¿Confirma la Eliminación?", "Eliminado " + dev_tabla.getName(), JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
                if (opcion == 0) {

                    Util u = new Util();

                    if (System.getProperty("accion_eliminar").equals("UPDATE")) {
                        //estado es un campo diferente a id_estado?? uno es para eliminar y el otro el estado del medico??
                        sql = "UPDATE " + System.getProperty("tabla_bd") + " SET  estado = 0 WHERE id_" + System.getProperty("tabla_bd") + " = " + id;
                        tituloMensajeOK = "[¡Información Eliminada Correctamente!] Cambio de Estado Realizado con Exito";
                        tituloMensajeBAD = "[Cambio de Estado Fallido.] No se produjo ningún cambio.";
                    } else if (System.getProperty("accion_eliminar").equals("DELETE")) {
                        sql = "DELETE FROM " + System.getProperty("tabla_bd") + " WHERE id_" + System.getProperty("tabla_bd") + " = " + id;
                        tituloMensajeOK = "[¡Eliminacion Exitosa!] Se ha borrado el Registro";
                        tituloMensajeBAD = "[No se logro Eliminar la Información.] No se produjo ningún cambio.";
                    }else if (System.getProperty("accion_eliminar").equals("DELETE_PLANILLA")){
                        try {
                            if(!CitaDAO.esPlanillaEliminable(id)){
                                tituloMensajeBAD = "[No se logro Eliminar la Información.] No se pueden eliminar planillas con citas asignadas.";
                                c.informarUsuario("error" + tituloMensajeBAD + " <b>" + dev_tabla.getName() + "</b> la operación no se realizo satisfactoriamente.");
                                isPushed = false;
                                return new String(label);
                            }
                        } catch (Exception ex) {
                            tituloMensajeBAD = ex.getMessage();
                        }
                        sql = "DELETE FROM " + System.getProperty("tabla_bd") + " WHERE id_" + System.getProperty("tabla_bd") + " = " + id;
                        tituloMensajeOK = "[¡Eliminacion Exitosa!] Se ha borrado el Registro";
                        tituloMensajeBAD = "[No se logro Eliminar la Información.] No se produjo ningún cambio.";
                    }
                    if (u.sqlEjec(sql)) {
                        c.constructor(dev_tabla.getName() + "_View_Grid");
                        c.informarUsuario("ok" + tituloMensajeOK );
                    } else {
                        c.informarUsuario("error" + tituloMensajeBAD + " <b>" + dev_tabla.getName() + "</b> la operación no se realizo satisfactoriamente.");
                    }

                }
            } else if (Action.equals("Cancelar")) {
                String tituloMensajeOK = "";
                String tituloMensajeBAD = "";
                
                if(esCitaCancelable(id)){
                    int opcion = JOptionPane.showConfirmDialog(null, "¿Confirma la Cancelación?", "Cancelar "
                            + dev_tabla.getName(), JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
                    if (opcion == 0) {
                        //estado es un campo diferente a id_estado?? uno es para eliminar y el otro el estado del medico??
//                        sql = "UPDATE " + System.getProperty("tabla_bd") + " SET  id_paciente = null, estado = '1' WHERE id_" + System.getProperty("tabla_bd") + " = " + id;
                        tituloMensajeOK = "[¡Cita cancelada Correctamente!] Cambio de Estado Realizado con Exito";
                        tituloMensajeBAD = "[Cambio de Estado Fallido.] No se produjo ningún cambio.";


//                        if (u.sqlEjec(sql)) {
                        if (CitaDAO.borrarCitas(id)) {
                            c.constructor(dev_tabla.getName() + "_View_Grid");
                            c.informarUsuario("ok" + tituloMensajeOK);
                        } else {
                            c.informarUsuario("error" + tituloMensajeBAD + " <b>" + dev_tabla.getName() + "</b> la operación no se realizo satisfactoriamente.");
                        }
                    }
                }else{
                    c.informarUsuario("error" + "[Cambio de estado fallido]" + " <b>" + dev_tabla.getName() + 
                            "</b> No se pueden cancelar citas atendidas o con fecha anterior a la actual.");
                }
            }
        }
        isPushed = false;
        return new String(label);
    }

    public boolean stopCellEditing() {
        isPushed = false;
        return super.stopCellEditing();
    }

    protected void fireEditingStopped() {
        try {
            super.fireEditingStopped();
        } catch (Exception e) {
            System.out.println("Han Cambiado los Datos en la dev_tabla " + e.getMessage());
        }
    }

    private boolean esCitaCancelable(String idCita) {
        Util u = new Util();
        String sqlFecha = String.format(
                "select planilla_horario.fecha_agendada, cita.hora "
                + "from planilla_horario natural join cita where cita.id_cita = %s",
                idCita);

        Object[][] sqlDatos = u.sqlDatos(sqlFecha);
        String fecha = (String)sqlDatos[0][0];
        String hora = (String)sqlDatos[0][1];
        
        String sqlAsignado = String.format(
                "select estado from cita where id_cita = %s", idCita);
        sqlDatos = u.sqlDatos(sqlAsignado);
        boolean ret = ASIGNADO.equals(sqlDatos[0][0]);
        
        SimpleDateFormat s = new SimpleDateFormat("yy-MM-dd kk:mm");
        String test = fecha + " " + hora;
        Date result = new Date();
        Date compa = new Date();

        try {
            result = s.parse(test);
            ret = ret && !(result.before(compa));
            System.out.println(fecha + " " + hora);
            System.out.println("Ret: " + ret + " result " + result + " compa " + compa);
        } catch (ParseException ex) {
            Logger.getLogger(Borrarme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ret;
    }
}